As the complexity of modern computing systems increases, more and more unexpected performance events may occur in the systems to cause performance degradation, such as when a processor experiences low utilization or a cache experiences a low hit rate. A performance event is a cause for a performance bottleneck. A user may notice that an application takes a longer time to run but may not easily pin-point what event has occurred that causes the problem. Some modern computing systems are equipped with performance counters that can be configured to measure various aspects of performance, such as memory bandwidth or processor utilization. The runtime data is evaluated to determine the source of the problem. However, the number of available performance counters, as well as the buffer space for storing the counter data, is usually smaller than the possible performance events that may occur in the computing system.
To monitor a wide range of performance events, computing systems typically collect data for a subset of performance events at a time. Each time performance counters are configured for one subset of performance events and the application is restarted to collect data for the subset. A round-robin policy may be used to determine for which subset to collect data, and the application is restarted multiple times in order to cover all of the possible performance events. Repeatedly restarting an application at runtime is undesirable.
Therefore, improved tools are desired for detecting performance bottlenecks to optimize runtime performance of a computing system.